﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PSE.ProcessManager.Server.Process.Security;
using Sinacor.Infra.Core.ProcessManager.Server.Security;
using Sinacor.AuditLogging.LogEntry;

namespace Sinacor.Infra.Core.ProcessManager.Server.AuditLogging
{
    public class LogSender
    {
        /// <summary>
        /// Método de envio de logs de auditoria de processos (Process Manager) do Sinacor.
        /// Atençâo: Não deve ser utilizado no construtor do processo, uma vez que nesse momento ainda não existe o contexto
        /// de Authenticação, de onde são recuperadas as informações de usuário, módulo e empresa.
        /// </summary>
        public static void Send(SinacorBaseLogEntry logEntry)
        {
            if (logEntry == null)
                throw new ArgumentNullException("logEntry");

            FillDefaultValues(logEntry);
            PSE.AuditLogging.Client.LogSender.Send(logEntry);
        }

        private static void FillDefaultValues(SinacorBaseLogEntry logEntry)
        {
            //caso o contexto de autenticacao nao exista, disparar error específico
            if (AuthenticationContext<SinacorAuthenticationData>.Current == null && AuthenticationContext<SinacorAuthenticationData>.Current.AuthenticationData == null)
                throw new Exception("Unable to fill logEntry internal values. Authentication context is not set.");

            logEntry.UserId = AuthenticationContext<SinacorAuthenticationData>.Current.AuthenticationData.UserId;
            logEntry.CompanyId = AuthenticationContext<SinacorAuthenticationData>.Current.AuthenticationData.CompanyId;
            logEntry.ModuleId = Convert.ToString(AuthenticationContext<SinacorAuthenticationData>.Current.AuthenticationData.ModuleId);
        }
    }
}
